#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

typedef struct Result
{
    char *msg;
    int date;
} Result;
// void fn()
// {
// return; //不会结束线程
// pthread_exit(NULL); //结束线程
// }
void *red_thread(void *arg) // char *
{
    char code = *(char *)arg;
    printf("红玫瑰开始执行 code=%c\n", code);
    // 不断读取用户输入
    char input[10];
    while (1)
    {
        // 读取用户输入
        fgets(input, sizeof(input), stdin);
        // 如果输入的是r，返回特定数据结束
        if (input[0] == code)
        {
            printf("红玫瑰结束执行");
            Result *result = malloc(sizeof(Result));
            result->msg = "红玫瑰去巴黎了";
            result->date = 15;
            // return result;
            pthread_exit(result); // 终止线程,并指定返回值
        }
        // 否则输出读到的数据
        else
        {
            printf("红玫瑰读到数据：%s\n", input);
        }
    }
}
void *white_thread(void *arg)
{
    char code = *(char *)arg;
    printf("白玫瑰开始执行 code=%c\n", code);
    char input[10];
    while (1)
    {
        // 读取用户输入
        fgets(input, sizeof(input), stdin);
        // 如果输入的是r，返回特定数据结束
        if (input[0] == code)
        {
            printf("白玫瑰结束执行\n");
            Result *result = malloc(sizeof(Result));
            result->msg = "白玫瑰去纽约了";
            result->date = 15;
            return result;
        }
        // 否则输出读到的数据
        else
        {
            printf("白玫瑰读到数据：%s\n", input);
        }
    }
}
int main(int argc, char const *argv[])
{
    // 创建2个线程
    pthread_t red_pt, white_pt;
    char red_code = 'r';
    char white_code = 'w';
    Result *red_result;
    Result *white_result;
    pthread_create(&red_pt, NULL, red_thread, &red_code);
    pthread_create(&white_pt, NULL, white_thread, &white_code);
    // 等待两个线程执行完毕
    pthread_join(red_pt, (void **)&red_result);
    pthread_join(white_pt, (void **)&white_result);
    printf("main线程得到红玫瑰返回结果:%s,日期:%d号\n", red_result->msg, red_result->date);
    printf("main线程得到白玫瑰返回结果:%s,日期:%d号\n", white_result->msg, white_result->date);
    free(red_result);
    free(white_result);
    return 0;
}
